#类方法--针对类对象定义的方法
'''
需要使用装饰器@classmethod来表示其为类方法，对于类方法，
第一个参数必须是类对象，一般以cls作为第一个参数。

在类方法内部可以直接访问类属性或调用类方法

'''
'''
class Tool(object):
    self.age = 20       #属性
    def funa(self):     #实例方法
        print(123)

t = Tool()
'''
#类方法使用场景
'''
1.当方法中需要使用类对象（如访问私有类属性等）时，定义类方法。

2.类方法一般和类属性配合使用。

'''
#定义格式：
'''
class 类名:
    @classmethod         ---类方法的标志
    def 方法名(cls):     ---第一个参数必须是cls(代表的是当前类名)
        方法体

调用格式：
类名.方法名(实参)
对象名.方法名(实参)        #不常用

'''
#类方法内部使用类属性：cls.属性
#类方法内部使用类方法：cls.类方法()
#类方法本质：将类本身作为对象进行操作的方法。
#通过类方法，让类名能像实例对象一样去调用类中的方法和属性。
'''
class Person:
    age = 20      #类属性
    @classmethod  #类方法
    def human(cls):
        return cls.age   #类名.属性名  赖操作类属性
p = Person()
print(p.human())     #20 实例对象可以访问类方法
print(Person.human())#20 通过类对象引用
print('\n')
'''

#对类属性进行修改

class Person:
    age = 20      #类属性
    @classmethod
    def get_age(cls):   #获取类属性
        print(cls.age)

    @classmethod
    def set_age(cls,age):  #设置属性--赋值更新
        cls.age = age

p = Person()
p.get_age()        #20 实例对象.类方法 获取属性
Person.get_age()   #20 类对象.类方法 获取属性
p.set_age(18)
p.get_age()        #18
print('\n')


#静态方法
'''
需要使用装饰器@staticmethod来进行修饰，静态方法既不需要传递
类对象，也不需要传递实例对象（没有形参self/cls）

静态方法也能够通过实例对象和类对象进行访问

定义格式：
@staticmethod
def 方法名():
    方法体

'''
#静态方法是类中的函数，途不需要实例。可以裂解为独立、单纯的函数
#例1
class Dog(object):
    @staticmethod
    def bark():
        print('汪汪叫')

dog = Dog()
dog.bark()
print('\n')

#例2
class A:
    age = 10
    @staticmethod
    def get_age():
        return A.age
a = A()
print(a.get_age())   #实例对象可以访问静态方法
print(A.get_age())   #类对象也可以访问静态方法



        


    
